package com.java2405.first.luoyang_management.jwt.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {
/** 过期时间，单位：秒，默认半⼩时过期 **/
private static final long EXPIRATION = 60 * 30L * 1000;
/** 密钥，⼀般⻓度较⻓，内容较复杂 **/
private static final String SECRET = "uNolskF3N9qlQ69pGbzUTOm7w7nD1BCU1lWc0a4sUTBvINWkepycsPZiPzf5JH85";
/**
* @description 创建token
**/
public static String createToken(Map<String, String> claimMap) {
    // 当前时间戳加上设定的毫秒数（1秒 == 1000毫秒）
    System.out.println(EXPIRATION);
    System.out.println(new Date().getTime()+EXPIRATION);
    Date expiration = new Date(new Date().getTime()+EXPIRATION);
    // 设置JWT头部
    Map<String, Object> map = new HashMap<>();
    map.put("alg", "HS256");
    map.put("typ", "JWT");
    // 创建token
    JWTCreator.Builder builder = JWT.create();

    System.out.println("创建Token的参数claimMap:" + claimMap);
    //使⽤Lambda创建payload
    claimMap.forEach((k,v)->{
        builder.withClaim(k,v);
    });
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(expiration));
    // 添加头部，可省略保持默认，默认即map中的键值对
    return builder.withHeader(map)
//            .withAudience(username)
    // 设置过期时间
    .withExpiresAt(expiration)
    // 设置签名解码算法
    .sign(Algorithm.HMAC256(SECRET));
}

public static DecodedJWT verifyToken(String token) {
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
        System.out.println("验证Token的函数得到的Token："+verify.getToken());
        System.out.println("验证Token的函数得到的Header："+verify.getHeader());
        return verify;
    }
}